import UIKit

/**
 B站：https://www.bilibili.com/video/BV144411C7Gg?p=4
 
 元组类型

    不同的数据类型，组装在一起的集合
 */

// 定义方式一：推断类型
var a = (1, 23.44, "hello", true)
//print(a)

let (name1, name2) = ("Swift", 1.5)
print(name1, name2)

// 定义方式二：指定类型
var b:(Int, String) = (11, "world")
//print(b)


//-------------------------------------------------------------------------
// 错误写法
//var c = () // 会有警告
//print(c)

//var d:(Int) = () // 报错
//print(d)

//-------------------------------------------------------------------------
// 【元组】取值 方式一：通过索引
print(a.0)
print(a.3)

// 【元组】重新赋值
b.0 = 100

let aa = (1, "srx")
//aa.0 = "22" // 可切换方便 被注释掉了
//aa.0 = 100 // 可切换方便 被注释掉了
//1- let 定义的元组，不可被赋值

//a.0 = "aaaa" // 可切换方便 被注释掉了
//b.0 = "bbbb" // 可切换方便 被注释掉了
//2- 定义的元组，已经被规范 内容类型，不可通过赋值，更改原来位置的类型

//-----------------------------------------
// 【元组】取值 方式一：通过别名
var bb = (name: "srx", age: 18)
print(bb.name)

var cc:(name: String, age: Int) = ("孙", 80)
print(cc)
print(cc.age)

//-------------------------------------------------------------------------
// 忽略某个位置的元组， 常用于不知道的数据类型、扩展等等
let (name11, _, name22) = ("Swift", true, 1.5)
print("name11 name22 =>", name11, name22)

let (_, name33, name44) = ("Swift", true, 1.5)
print("name33 name44 =>", name33, name44)

print("------------")
//-------------------------------------------------------------------------
// 元组 当做 参数、返回值

var data = (name1: 1, name2: "hello", name3: true)

// 函数
func handle(parm:(Int, String, Bool)) -> (Int, String, Bool) {
//    var data_temp = parm // 可切换方便 被注释掉了
    var data_temp:(Int, String, Bool)
    
    data_temp.0 = parm.0 + 1
    data_temp.1 = parm.1 + " world"
    data_temp.2 = false
    return data_temp
}

print("data=>", data)
let data2 = handle(parm: data)
print("222 data2=>", data2)

/**
 
 总结:
 
 传入的参数是 带有别名的元组，返回的 索引的组员

    说明 别名的元组 是 索引的元素 的扩展。
 
  那么，传入 索引的元组，返回 别名的元组，也是可以的。
 */


func handle2(parm:(name: Int, name2: String, name3: Bool)) -> (name: Int, name2: String, name3: Bool) {
//    var data_temp = parm // 可切换方便 被注释掉了
    var data_temp:(Int, String, Bool)
    
    data_temp.0 = parm.0 + 10
    data_temp.1 = parm.1 + " world——ss"
    data_temp.2 = false
    return data_temp
}

let data3 = handle2(parm: data2)
print("333 data3=>", data3)
